############################################################################## ############################################################################## # # Ficha 1 # ############################################################################## ############################################################################## #----------------------------------------------------------------------------- # Exercício 1 #----------------------------------------------------------------------------- # Alínea a) # --------- # Criar vector com os dados. ni <- c("Noz"=12,"Avelã"=8,"Amêndoa"=9,"Pinhão"=4,"Caju"=7,"Amendoim"=10) # Gráfico de barras. bp = barplot(ni,ylim=c(0,20),main="Fruto preferido") # Adicionar valores de ni no topo das barras. nis <- as.vector(ni) # as.vector(x) não copia nomes de x. text(bp,nis+1,labels=as.character(ni)) # as.character(x) converte x para texto. # Alínea b) # --------- # Gráfico circular simples. pie(ni,main="Fruto preferido") # Gráfico circular com percentagens: xi <- names(ni) n <- sum(ni) pct <- round(ni/n*100) # Nota: paste() concatena vectores depois de convertê-los para caracteres. e <- paste(xi," (",pct,"%)",sep="") pie(ni,labels=e,main="Fruto preferido") #----------------------------------------------------------------------------- # Exercício 2 #----------------------------------------------------------------------------- # Alínea a) # --------- # Vector com os dados. x <- c(0, 2, 5, 1, 3, 3, 2, 4, 3, 4, 2, 1, 1, 0, 2, 3, 3, 5, 1, 0, 4, 3, 4, 5, 1, 0, 0, 2, 3, 1, 0, 3, 3, 1, 2, 5, 2, 2, 4, 1, 4, 1, 2, 3, 5, 2, 1, 4, 0, 3) # Frequências absolutas. ni <- table(x) # Nota: ni é um vector de inteiros em que os nomes das posições # são as classes (neste caso, os valores de xi). # Classes. xi <- as.numeric(names(ni)) # Frequências relativas. n <- length(x) # ou n <- sum(ni) fi <- prop.table(ni) # ou fi <- ni/n # Frequências relativas acumuladas. Fi <- cumsum(fi) # Tabela de frequências usando data.frame(). # Nota: A função I() preserva os nomes dos vectores. tab <- data.frame(I(xi),I(ni),I(fi),I(Fi)) tab # Remoção dos nomes atribuídos às linhas da tabela. rownames(tab) <- c() tab # Alínea b) # --------- # Média xbar <- mean(x) # ou xbar <- sum(xi*ni)/n xbar # Mediana me <- median(x) # ou # xs <- sort(x) # me <- (xs[n/2]+xs[n/2+1])/2 # n par me # Percentis pct <- quantile(x,probs=c(0.25,0.5,0.75),type=1) pct # Alínea c) # --------- # Variância s2 <- var(x) # ou s2 <- (sum(xi^2*ni)-n*xbar^2)/(n-1) s2 # Desvio padrão s <- sd(x) # ou s <- sqrt(s2) s # Coeficiente de variação cv <- 100*s/xbar cv # Amplitude interquartil AI <- IQR(x,type=1) # ou AI <- pct[3]-pct[1] AI # Alínea d) # --------- # Coef. de assimetria. # Uma possibilidade seria usar o pacote moments, que inclui as funções # skewness(x) e kurtosis(x). # install.packages(moments) # Se este pacote ainda não está instalado. # library(moments) # Para carregar pacote na sessão de trabalho. # a3 <- skewness(x) # Nota: Esta versão não coincide com o modelo estudado! # Assim, é melhor usar: m3 <- sum((xi-xbar)^3*ni)/n a3 <- m3/s^3 a3 # Conclusão: A distribuição é ligeiramente assimétrica positiva (enviesada # à direita). # Coef. de curtose. # Uma possibilidade seria usar o pacote moments: # a4 <- kurtosis(x) # Nota: Esta versão não coincide com o modelo estudado! # Assim, é melhor usar: m4 <- sum((xi-xbar)^4*ni)/n a4 <- m4/s^4 a4 # Conclusão: A distribuição tem caudas menos pesadas (é mais achatada) do que # a distribuição normal. # Alínea e) # --------- # Diagrama de caixa. bp = boxplot(x) bp$stats # Nota: Os quartis de boxplot() podem não coincidir com os do modelo estudado! # Alínea f) # --------- # Gráfico de barras. bp = barplot(ni,ylim=c(0,15)) # Adicionar valores de ni no topo das barras. nis <- as.vector(ni) # as.vector(x) não copia nomes de x. text(bp,nis+1,labels=as.character(ni)) #----------------------------------------------------------------------------- # Exercício 3 #----------------------------------------------------------------------------- # Alínea a) # --------- # Média Li <- seq(0,70,10) Ls <- Li+10 xi <- (Li+Ls)/2 ni <- c(18,38,78,94,105,83,57,27) n <- sum(ni) xbar <- sum(xi*ni)/n xbar # Tabela de frequências fi <- ni/n Fi <- cumsum(fi) cl <- paste("[",Li,", ",Ls,"[",sep="") #tab <- data.frame(classes=cl,xi=xi,ni=ni,fi=fi,Fi=Fi) tab <- data.frame(classes=cl,xi,ni,fi,Fi) tab # Mediana hi <- Ls-Li a <- 0.5 # Ordem do quantil. k <- which(Fi>=a)[1] # Indice da classe mediana (1ª classe com Fi>=0.5). k if (k>1) { me <- Li[k]+hi[k]/fi[k]*(a-Fi[k-1]) } else { me <- Li[k]+hi[k]/fi[k]*a # Nota: F(x) = 0 no limite inf. do 1º intervalo. } me # Percentis 25 e 75 a <- c(0.25,0.75) k <- numeric(length(a)) # Cria vector de zeros com o tamanho do vector a. for (i in 1:length(a)) k[i] <- which(Fi>=a[i])[1] k pct <- Li[k]+hi[k]/fi[k]*(a-Fi[k-1]) pct # Alínea b) # --------- # Variância s2 <- (sum(xi^2*ni)-n*xbar^2)/(n-1) s2 # Desvio padrão s <- sqrt(s2) s # Coef. de variação cv <- 100*s/xbar cv # Alínea c) # --------- # Coef. de assimetria m3 <- sum((xi-xbar)^3*ni)/n a3 <- m3/s^3 a3 # Conclusão: A distribuição é ligeiramente assimétrica negativa (enviesada # à esquerda). # Coef. de curtose m4 <- sum((xi-xbar)^4*ni)/n a4 <- m4/s^4 a4 # Conclusão: A distribuição tem caudas menos pesadas (é mais achatada) do que # a distribuição normal. # Alínea d) # --------- # Histograma r <- rep(xi,ni) # Cria amostra de dados não agrupados com mesmos ni's b <- seq(0,80,10) # Vector com limites das classes hist(r,breaks=b,right=FALSE,main="Histograma",xlab="x",ylab="ni",ylim=c(0,120),labels=T) #----------------------------------------------------------------------------- # Exercício 4 #----------------------------------------------------------------------------- # Alínea a) # --------- # Dados x <- c(393, 203, 395, 237, 392, 224, 363, 298, 352, 240, 207, 287, 258, 203, 214, 209, 204, 232, 285, 391, 374, 317, 203, 203, 322, 206, 208, 268, 265, 399, 361, 384, 208, 398, 215, 351, 245, 385, 382, 214, 207, 211, 375, 213, 350, 395, 208, 321, 354, 348, 362, 210, 344, 203, 334, 203, 391, 261, 250, 205, 286, 271, 397, 215, 213, 227, 218, 398, 331, 362, 219, 344, 396, 214, 382, 215, 382, 399, 251, 358, 207, 356, 310, 212, 381, 204, 276, 339, 399, 211, 372, 245, 394, 209, 306, 205, 350, 274, 306, 217) # Nº de classes pela Regra de Sturges. n <- length(x) nc <- ceiling(1+log2(n)) # nc = 8 # Intervalos de classe. xmax <- max(x) xmin <- min(x) h <- ceiling((xmax-xmin)/nc) # h = 25 Li <- seq(xmin,xmin+(nc-1)*h,h) # Ou Li <- seq(from=xmin,by=h,length=nc) Ls <- Li+h # Vector com limites das classes (breaks). b <- Li; b[nc+1] <- Ls[nc] # Factor com o intervalo de cada valor observado. # Intervalo vai ser fechado à esquerda. int <- cut(x,breaks=b,right=FALSE) # Tabela de frequências xi <- (Li+Ls)/2 ni <- table(int) classes <- names(ni) fi <- ni/n Fi <- cumsum(fi) tab <- data.frame(I(classes),I(xi),I(ni),I(fi),I(Fi)) rownames(tab) <- c() # Remove the row names of the dataframe. tab # Alínea b) # --------- # Média xbar <- mean(x) xbar # Mediana me <- median(x) me # Percentis pct <- quantile(x,probs=0.75,type=1) pct # Alínea c) # --------- # Variância s2 <- var(x) # ou s2 <- (sum(xi^2*ni)-n*xbar^2)/(n-1) s2 # Desvio padrão s <- sd(x) # ou s <- sqrt(s2) s # Coeficiente de variação cv <- 100*s/xbar cv # Alínea d) # --------- # Histograma. hist(x,breaks=b,right=FALSE,main="Histograma",xlab="x",ylab="ni",ylim=c(0,40),labels=T) #----------------------------------------------------------------------------- # Exercício 5 #----------------------------------------------------------------------------- # Alínea a) # --------- # Opção 1: Usar 2 vectores, x e y. x <- c(1.61,1.65,1.69,1.71,1.82,1.88,1.93,1.97,2.01) y <- c(62.7,65.3,68.3,64.7,75.4,80.6,82.7,87.2,98.5) # Opção 2: Usar data frame. dados <- data.frame(x=c(1.61,1.65,1.69,1.71,1.82,1.88,1.93,1.97,2.01), y=c(62.7,65.3,68.3,64.7,75.4,80.6,82.7,87.2,98.5)) # Diagrama de dispersão. # Opção 1 plot(x,y) # Opção 2 #plot(dados) # Alínea b) # --------- # Cálculo da recta de regressão (y = a+bx). # i) Usando as funções do R para regressão linear: # ............................................. rr <- lm(y ~ x) # ou rr <- lm(y ~ x,dados) rr # Equação da recta: y = -66.86 + 79.11x # Nota 1: "y ~ x" significa que y é uma função de x, ou seja, x é a variável # independente. # Nota 2: rr é um objecto do tipo "list". Para confirmar, executar mode(rr). # Extrair os coeficientes a e b do objecto rr e guardá-los num vector numérico. coefs <- coefficients(rr) coefs # ii) Usando as fórmulas dadas nas aulas teóricas: # ............................................ # A)Reproduzir estes cálculos no caderno, passo a passo. # B)Reproduzir estas fórmulas no R (TPC). n <- length(x) mx <- sum(x)/n # <=> mx <- mean(x) my <- sum(y)/n # <=> my <- mean(y) sxx <- sum(x^2)-n*mx^2 sxy <- sum(x*y)-n*mx*my b <- sxy/sxx a <- my-b*mx c(a,b) # Nota: Para adicionar a recta de regressão ao diagrama de dispersão pode-se # usar a função abline(). abline(rr) # ou abline(a,b) ou abline(coefs) # Alínea c) # --------- # i) Usando as funções do R para regressão linear: # ............................................. r <- cor(x,y) r # ii) Usando as fórmulas dadas nas aulas teóricas: # ............................................ # A)Reproduzir estes cálculos no caderno, passo a passo. # B)Reproduzir estas fórmulas no R (TPC). syy <- sum(y^2)-n*my^2 r <- b*sqrt(sxx/syy) r # Conclusão: É um bom ajuste porque |r| está próximo de 1. #----------------------------------------------------------------------------- # Exercício 6 #----------------------------------------------------------------------------- # Alínea a) # --------- # Dados. x <- c(15,20,30,40,50,60,80,90) y <- c(38,75,120,168,234,277,400,444) # Diagrama de dispersão. plot(x,y) # Alínea b) # --------- # Cálculo da recta de regressão (y = a+bx). rr <- lm(y ~ x) rr # Equação da recta: y = -41.295 + 5.419x # Representação da recta sobre o diagrama de dispersão. abline(rr) # Alínea c) # --------- r <- cor(x,y) r # Conclusão: É um ajuste muito bom porque |r| está muito próximo de 1. # Alínea d) # --------- coefs <- coefficients(rr) a <- coefs[1] b <- coefs[2] x0 <- 70 y0 <- a + b*x0 y0